#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>

using namespace std;

class Animal{
public:
	char *name;
public:
	Animal(){}
	// 构造函数
	Animal(char *name)
	{
		this->name = name;
	}
	// 拷贝构造函数
	Animal(const Animal *animal)
	{
		// 放入集合时候，需要进行深拷贝，因为放入集合的时候不是同一个对象，而是拷贝出来的对象会被进行析构
		this->name = (char *)malloc(sizeof(int)*24);
		cout << "Animal 拷贝构造函数" << endl;
	}
	// 析构函数
	~Animal()
	{
		cout << "Animal 析构函数" << endl;
		if(this->name){
			free(this->name);
			this->name = NULL;
		}
	}
public:
	void operator () ()
	{
		cout << "仿函数" << endl;	
	}
};

// 一元谓词
void print(int number)
{
	cout << number << endl;
}

struct PrintStrcut{

	// 仿函数
	void operator () (int number)
	{
		cout << number << endl;	
	}
	// 二元谓词
	bool operator () (const int &left, const int &right)
	{
		return left > right;
	}
};

int main()
{

#if 0
	Animal animal;
	// () 会调用被重载的仿函数
	animal();
#endif
	
	set<int, PrintStrcut> st;

	st.insert(1);
	st.insert(2);
	st.insert(3);
	st.insert(4);
	st.insert(5);

	for_each(st.begin(), st.end(), print);
	
	for_each(st.begin(), st.end(), PrintStrcut());


	return 0;
}

